package com.TetrisII.entities;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;

import com.TetrisII.global.Global;
import com.TetrisII.views.GamePanel;

/**
 * 所有图形的基类，各种变换方法
 * 
 * @author Administrator
 *
 */
public class Shape {
	private int[][] shapes = new int[4][16];// 方块
	private int status;// 第几种类型
	private int x;// 横坐标，向右+1，向左-1；
	private int y;// 纵坐标

	/**
	 * 构造函数
	 */
	public Shape() {
		x = 0;
		y = 0;
	}

	/**
	 * 初始化坐标
	 */
	public void initShape() {
		x = 0;
		y = -4;
	}

	/**
	 * 画出图形
	 * 
	 * @param g
	 */
	public void paintShape(Graphics g,GamePanel panel) {
		Graphics2D g_2 = (Graphics2D) g;
		URL url=GamePanel.class.getResource("方块.PNG");
		Image image=Toolkit.getDefaultToolkit().getImage(url);
		
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				if (isPaint(i, j)) {
					g_2.drawImage(image, (x + i) * Global.CELL, (j + y) * Global.CELL, Global.CELL, Global.CELL, panel);
				}
			}
		}
	}

	/**
	 * 左移动方法
	 */
	public void moveLeft() {
		x--;
	}

	/**
	 * 右移动方法
	 */
	public void moveRight() {
		x++;
	}

	/**
	 * 向下移动方法
	 */
	public void moveDown() {
		y++;

	}

	/**
	 * 旋转方块
	 */
	public void changeBody() {
		status = (status + 1) % 4;

	}

	/**
	 * 用来判断旋转时候下个图形是否越界
	 * 
	 * @param x    方块相对横坐标
	 *            
	 * @param y     方块相对纵坐标
	 *            
	 * @return    下一个方块数组
	 */
	public boolean isNextbody(int x, int y) {
		return shapes[(status + 1) % 4][4 * y + x] == 1;
	}

	/**
	 * 判断是否能画
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isPaint(int x, int y) {
		return shapes[status][4 * y + x] == 1;
	}

	/**
	 * 方块绝对纵坐标
	 * 
	 * @return
	 */
	public int getX() {
		return x;
	}

	/**
	 * 获得方块绝对纵坐标
	 * 
	 * @return
	 */
	public int getY() {
		return y;
	}

	/**
	 * 获得方块类型
	 * 
	 * @return
	 */
	public int[][] getShapes() {
		return shapes;
	}

	/**
	 * 获得方块第n种类型的第n种变换
	 * 
	 * @return
	 */
	public int getStatus() {
		return status;
	}

	/**
	 * 设置方块类型
	 * 
	 * @param shapes
	 */
	public void setShapes(int[][] shapes) {
		this.shapes = shapes;
	}

	/**
	 * 设置方块第n种类型的第n种变换
	 * 
	 * @param status
	 */
	public void setStatus(int status) {
		this.status = status;
	}

	/**
	 * 设置方块绝对横坐标
	 * 
	 * @param y
	 */
	public void setY(int y) {
		this.y = y;
	}

	/**
	 * 设置绝对纵坐标
	 * 
	 * @param x
	 */
	public void setX(int x) {
		this.x = x;
	}
}
